package classes_0905;

//主类，public class 必须和文件名一致
public class Student {
    public String name="阿欢";//默认null
    public int age=18;//默认0
    public String sex="女";//默认null
/**
 * name=name  会导致对象赋值不成功
 * this.name=name 打破就近原则，从类中匹配
 * 程序的就近匹配原则：
 * 编译器会从调用代码处的最近位置查找有无匹配的变量或者方法，若找到直接使用最接近的变量或者方法
 *
 * this关键字：
 * 一、给类中同名属性赋值
 * 二、调用当前类的成员方法
 * 三、构造方法的调用
 * 四、表示当前对象的引用(照镜子，this相当于镜子)
 * ps:
 * 1、this调用构造方法必须放在构造方法的首行
 * 2、调用构造方法不能成环,要有出口
 */

    //构造方法
    public Student() {
        //this(name,age,sex);调用构造方法不能成环
        System.out.println("****************");
    }
    public Student(String name,int age){
//        System.out.println("****************");//代码重复，质量不佳
        this();//调用无参构造
        this.name=name;
        this.age=age;
        //this()错误必须放首行
    }
    public Student(String name, int age, String sex) {
//        System.out.println("****************");
        this(name,age);//调用两个属性的有参构造
        this.sex = sex;
    }

    //构造方法，命名不规范的形参
//    public Student(String n,int a){
//        name=n;
//        age=a;
//    }
    public void fun(){
        System.out.println("姓名："+name+" 年龄："+age+" 性别："+sex);
        show();//可以不写差不多
        this.show();//在有继承和多态的情况下建议写

    }
    public void show(){
        System.out.println(this);
    }

    public static void main(String[] args) {
        //student称为Student对象的应用，保持了一块堆内存的地址

        //每当关键词new，产生新对象，在堆中开辟新空间
        Student student=new Student("程序员",16);
        System.out.println(student);
        student.show();

        Student student1=new Student();
        System.out.println(student1);
        student1.show();

        Student student2=new Student();
        System.out.println(student2);
        student2.show();

//        student.age=18;
//        student.name="程序员";
//        student.fun();
//        Student stu=student;//没有产生新的对象
//        stu.age=19;
//        stu.name="程序媛";
//        stu.fun();
//        System.out.println(student.age);//改变了
    }
}
//普通类
class Test01{

}
